import dokey from './dokey.js'
import http from '@/uview-ui/libs/request'
import store from '@/store'
import setting from '@/settings/projectSetting.js'
const codeMessage = {
    200: '服务器成功返回请求的数据',
    201: '新建或修改数据成功',
    202: '一个请求已经进入后台排队（异步任务）',
    204: '删除数据成功',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作',
    401: '用户没有权限（令牌、用户名、密码错误）',
    403: '用户得到授权，但是访问是被禁止的',
    404: '发出的请求是不存在的记录，服务器没有进行操作',
    406: '请求的格式不可得',
    410: '请求的资源被永久删除，且不会再得到的',
    422: '当创建一个对象时，发生一个验证错误',
    500: '服务器发生错误，请检查服务器',
    502: '网关错误',
    503: '服务不可用，服务器暂时过载或维护',
    504: '网关超时',
}
// 此为自定义配置参数
http.setConfig({
    baseUrl: setting.appApiUrl,
    // #ifndef APP-PLUS
    showLoading: true, // 是否显示请求中的loading
    // #endif
    // #ifdef APP-PLUS
    showLoading: false, // 是否显示请求中的loading
    // #endif
    loadingText: '努力加载中~', // 请求loading中的文字提示
    loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
    originalData: true, // 是否在拦截器中返回服务端的原始数据
    loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
    // 配置请求头信息
    header: {
        'Is-Axios': 1,
        'E-DEVICE-TYPE': setting.appDeviceType,
        'E-APP-ID': setting.appId,
    },
})

// 请求拦截，配置Token等参数
http.interceptor.request = (config) => {
    // 引用token
    // 方式一，存放在vuex的token，假设使用了uView封装的vuex方式
    // 见：https://uviewui.com/components/globalVariable.html
    // config.header.token = vm.token;

    // 方式二，如果没有使用uView封装的vuex方法，那么需要使用$store.state获取
    // config.header.token = vm.$store.state.token;

    // 方式三，如果token放在了globalData，通过getApp().globalData获取
    // config.header.token = getApp().globalData.username;

    // 方式四，如果token放在了Storage本地存储中，拦截是每次请求都执行的
    // 所以哪怕您重新登录修改了Storage，下一次的请求将会是最新值
    // const token = uni.getStorageSync('token');
    // config.header.token = token;
    let params = config.data || config.params
    if (!uni.$u.test.object(params)) {
        params = {}
    }
    config.header = {
        ...config.header,
        'E-MHM-ID': store.state.projectSetting.globSchoolId,
        'E-SHARE-CODE': store.state.projectSetting.globShareCode,
        ...dokey.secretdate(params),
    }
    const token = store.getters['user/getToken']
    config.header['E-USER-AK'] = token.ak
    config.header['E-USER-SK'] = token.sk
    return config
}

// 响应拦截，判断状态码是否通过
http.interceptor.response = (res) => {
    if (res.data.code == 1) {
        // res为服务端返回值，可能有code，result等字段
        // 这里对res.result进行返回，将会在this.$u.post(url).then(res => {})的then回调中的res的到
        // 如果配置了originalData为true，请留意这里的返回值
        return Promise.resolve(res.data)
    } else {
        // 如果返回false，则会调用Promise的reject回调，
        // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
        if (res === undefined || res.code === 'ECONNABORTED') {
            uni.$u.toast('服务请求超时')
            return Promise.reject(res.data)
        }
        const {
            statusCode,
            data: { msg = '' },
        } = res
        if (statusCode === 401) {
            let login = () => {
                store.dispatch('user/logout')
                uni.$u.route({ url: '/pageUser/login/index' })
            }
            uni.$u.debounce(login(), 500)
        } else {
            let msgText = msg || codeMessage[statusCode]
            let message = () => {
                uni.$u.toast(`${msgText}`)
            }
            uni.$u.debounce(message(), 500)
        }
        return Promise.reject(res.data)
    }
}

export default http
